iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
SideProject30

HOW TO GO系列 第 21

21. ebiten (5)

  • 分享至 

  • xImage
  •  

動畫

參考這個範例:Animation


const (
	screenWidth  = 320
	screenHeight = 240

	frameOX     = 0
	frameOY     = 32
	frameWidth  = 32
	frameHeight = 32
	frameCount  = 8 // frameCount 取決於總共有幾張圖片
)

// ...略

func (g *Game) Update() error {
	g.count++
	return nil
}

func (g *Game) Draw(screen *ebiten.Image) {
	op := &ebiten.DrawImageOptions{}
	op.GeoM.Translate(-float64(frameWidth)/2, -float64(frameHeight)/2)
	op.GeoM.Translate(screenWidth/2, screenHeight/2)

    // count 通常在 Update() 持續遞增
    // 因此調整目前數字 5 的部分可以調整顯示速度
	i := (g.count / 5) % frameCount
	sx, sy := frameOX+i*frameWidth, frameOY
	
	// 單張圖片可以繪製該圖片的一小部分,也就是說可以分割成多張圖片繪製
	// 控制裡面的變數,達成動畫的效果
	screen.DrawImage(runnerImage.SubImage(image.Rect(sx, sy, sx+frameWidth, sy+frameHeight)).(*ebiten.Image), op)
}

// ...略

這邊比較麻煩的地方是需要知道圖片的大小,尤其是網路圖片通常都不會標註,每一格圖片的長寬是多少

因此,如果不借助其他工具的話,可以這樣使用。一邊動態調整數值,找到適當的長寬然後記錄下來

// 範例

var frameOX int = 0

// 鍵盤偵測調整數值
if repeatingKeyPressed(ebiten.KeyZ) {
	frameOX++
}

// 顯示目前數值
ebitenutil.DebugPrintAt(screen, fmt.Sprintf("frameOX: %d", frameOX), 0, 20)

上一篇
20. ebiten (4)
下一篇
22. Entity Component System (1)
系列文
HOW TO GO30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言